﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using BussinessLogic;
using CrystalDecisions.Web;

namespace SchoolManagement.Forms.Controls
{
    public partial class ControlVisualizadorReportes : System.Web.UI.UserControl
    {
        private ArrayList _valoresReporte;
        private ArrayList _vacio;
        /// <summary>
        /// 
        /// </summary>
        public ReportDocument DocumentoReporte
        {
            get
            {
                return DataSourceReportesCrystal.ReportDocument;
            }
        }

        /// <summary>
        /// Se ejecuta al cargarse la pagina.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            VisualizadorReportesCristal.HasCrystalLogo = false;
            //  // esto se hace para traer el total
        }


        /// <summary>
        /// Funcion que realiza la navegación sobre el reporte, devuelve el indice 
        /// de la pagina actual luego de la navegación
        /// </summary>
        /// <param name="comando">Tipo de Navegacion</param>
        /// <returns></returns>
        public string Navegar(NavegacionReporte comando)
        {
            return Navegar(comando, -1);
        }


        /// <summary>
        /// Funcion que realiza la navegación sobre el reporte, devuelve el indice 
        /// de la pagina actual luego de la navegación
        /// </summary>
        /// <param name="comando">Tipo de Navegacion</param>
        /// <param name="index">Indice de la página a navegar</param>
        public string Navegar(NavegacionReporte comando, int index)
        {
            switch (comando)
            {
                case NavegacionReporte.Primero:
                    VisualizadorReportesCristal.ShowFirstPage();
                    break;
                case NavegacionReporte.Anterior:
                    VisualizadorReportesCristal.ShowPreviousPage();
                    break;
                case NavegacionReporte.Siguiente:
                    VisualizadorReportesCristal.ShowNextPage();
                    break;
                case NavegacionReporte.Ultimo:
                    VisualizadorReportesCristal.ShowLastPage();
                    break;
                case NavegacionReporte.IrA:
                    VisualizadorReportesCristal.ShowNthPage(index);
                    break;
                default:
                    break;
            }


            // Actualiza la Descripcion de la página Actual
            return GetDescripcionPaginaActual();
        }




        /// <summary>
        /// 
        /// </summary>
        public void Search(string search)
        {
            VisualizadorReportesCristal.SearchAndHighlightText(search, SearchDirection.Forward);
            VisualizadorReportesCristal.SearchAndHighlightText(search, SearchDirection.Backward);
        }


        /// <summary>
        /// 
        /// </summary>
        public void ZoomTo(int zoomLevel)
        {
            VisualizadorReportesCristal.Zoom(zoomLevel);
        }





        /// <summary>
        /// Obtiene el string que describe la página Actual
        /// </summary>
        /// <returns></returns>
        private string GetDescripcionPaginaActual()
        {
            if (VisualizadorReportesCristal.ViewInfo.PageNumber > VisualizadorReportesCristal.ViewInfo.LastPageNumber)
                VisualizadorReportesCristal.ShowNthPage(VisualizadorReportesCristal.ViewInfo.LastPageNumber);

            return string.Format("Página {0} de {1}", VisualizadorReportesCristal.ViewInfo.PageNumber, VisualizadorReportesCristal.ViewInfo.LastPageNumber);
        }


        /// <summary>
        /// Se realiza la configuración inicial del reporte.
        /// </summary>
        private void ConfigureCrystalReports()
        {
            PopulateStockValuesArrayList();
            ArrayList nada = (ArrayList)Session["VacioArrayList"];
            LlenarSubreportes(_valoresReporte, nada, DocumentoReporte);
            ConfigurarHeader();
            VisualizadorReportesCristal.EnableDrillDown = false;
        }




        private void ConfigurarHeader()
        {
            ////// Configuramos primero el Nombre del Usuario Actual.
            ////Usuario user = new Usuario(string.Empty);
            ////if (Session["Usuario"] != null)
            ////    user.Nombre = (Session["Usuario"] as BaseUser).UserName;
            ////List<Usuario> listausers = new List<Usuario>();
            ////listausers.Add(user);
            ////DocumentoReporte.Subreports["SubReportUsuario"].SetDataSource(listausers);
            ////// Luego configuramos el Titulo del Reporte.
            ////Titulo title = new Titulo(string.Empty);
            ////if (Session["TituloConsulta"] != null)
            ////    title.Title = Session["TituloConsulta"].ToString();
            ////List<Titulo> listaTitles = new List<Titulo>();
            ////listaTitles.Add(title);
            ////DocumentoReporte.Subreports["SubReportTitulo"].SetDataSource(listaTitles);


        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="Valores"></param>
        /// <param name="vacio"></param>
        /// <param name="Documento"></param>
        public void LlenarSubreportes(ArrayList Valores, ArrayList vacio, ReportDocument Documento)
        {
            //foreach (ReportDocument item in Documento.Subreports)
            //{
            //    item.SetDataSource(vacio);
            //}

            foreach (Object item in Valores)
            {

                //if (item is List<Tanque>) DocumentoReporte.Subreports["SubReporteTanques"].SetDataSource(item);
                //if (item is List<Dique>) DocumentoReporte.Subreports["SubReporteDiques"].SetDataSource(item);
                //if (item is List<Hidrantes>) DocumentoReporte.Subreports["SubReportHidrante"].SetDataSource(item);
                //if (item is List<Drenaje>) DocumentoReporte.Subreports["SubReportDrenaje"].SetDataSource(item);
                //if (item is List<Monitor>) DocumentoReporte.Subreports["SubReportMonitores"].SetDataSource(item);
                //if (item is List<Valvula>) DocumentoReporte.Subreports["SubReportValvulas"].SetDataSource(item);
                //if (item is List<Pipesegment>) DocumentoReporte.Subreports["SubReportPipeSegment"].SetDataSource(item);
                //if (item is List<Soporte>) DocumentoReporte.Subreports["SubReportSoportes"].SetDataSource(item);
                //if (item is List<Cruce>) DocumentoReporte.Subreports["SubReportCruce"].SetDataSource(item);
                //if (item is List<Encerramiento>) DocumentoReporte.Subreports["SubReportEncerramiento"].SetDataSource(item);
                //if (item is List<Anodo>) DocumentoReporte.Subreports["SubReportAnodo"].SetDataSource(item);
                //if (item is List<Market>) DocumentoReporte.Subreports["SubReportPoste"].SetDataSource(item);
                //if (item is List<Umr>) DocumentoReporte.Subreports["SubReportUmr"].SetDataSource(item);
                //if (item is List<Caja>) DocumentoReporte.Subreports["SubReportCaja"].SetDataSource(item);
                //if (item is List<Escaleras>) DocumentoReporte.Subreports["SubReportEscaleras"].SetDataSource(item);
                //if (item is List<Casetas>) DocumentoReporte.Subreports["SubReportCasetas"].SetDataSource(item);

                //if (item is List<Rectificador>) DocumentoReporte.Subreports["SubReportRectificadores"].SetDataSource(item);
                //if (item is List<Acceso>) DocumentoReporte.Subreports["SubReportAccesos"].SetDataSource(item);
                //if (item is List<Cpraspadores>) DocumentoReporte.Subreports["SubReportCPRaspadores"].SetDataSource(item);
                //if (item is List<Motobombas>) DocumentoReporte.Subreports["SubReportMotobombas"].SetDataSource(item);
                //if (item is List<Trraspadores>) DocumentoReporte.Subreports["SubReportTRRaspadores"].SetDataSource(item);
                //if (item is List<Transformador>) DocumentoReporte.Subreports["SubReportTransformadores"].SetDataSource(item);
                //if (item is List<Zginestable>) DocumentoReporte.Subreports["SubReportZGInestable"].SetDataSource(item);
                //if (item is List<Bita>) DocumentoReporte.Subreports["SubReportBita"].SetDataSource(item);
                //if (item is List<Bocatoma>) DocumentoReporte.Subreports["SubReportBocatomas"].SetDataSource(item);
                //if (item is List<Boya>) DocumentoReporte.Subreports["SubReportBoyas"].SetDataSource(item);
                //if (item is List<BrazoDeCarga>) DocumentoReporte.Subreports["SubReportBrazosdeCarga"].SetDataSource(item);
                //if (item is List<Fosa>) DocumentoReporte.Subreports["SubReportFosas"].SetDataSource(item);
                //if (item is List<Masico>) DocumentoReporte.Subreports["SubReportMasico"].SetDataSource(item);
                //if (item is List<Ecopetrol.SigVit.Reports.Clases.Muelle>) DocumentoReporte.Subreports["SubReportMuelles"].SetDataSource(item);
                //if (item is List<Pasarela>) DocumentoReporte.Subreports["SubReportPasarelas"].SetDataSource(item);
                //if (item is List<Pina>) DocumentoReporte.Subreports["SubReportPinas"].SetDataSource(item);
                //if (item is List<Plataforma>) DocumentoReporte.Subreports["SubReportPlataformas"].SetDataSource(item);
                //if (item is List<SubEstacionElectrica>) DocumentoReporte.Subreports["SubReportSubEstacionElectrica"].SetDataSource(item);
                //if (item is List<PuntoInterfase>) DocumentoReporte.Subreports["SubReportPuntosInterfase"].SetDataSource(item);
                //if (item is List<Interfase>) DocumentoReporte.Subreports["SubReportInterfase"].SetDataSource(item);

                //if (item is List<SistemaReporte>) DocumentoReporte.Subreports["SubReporteSistemas"].SetDataSource(item);
                //if (item is List<SubsistemaReporte>) DocumentoReporte.Subreports["SubReportSubsistemas"].SetDataSource(item);
                //if (item is List<EstacionReporte>) DocumentoReporte.Subreports["SubReporteEstaciones"].SetDataSource(item);

                //if (item is List<EsquemaEllipse>) DocumentoReporte.Subreports["SubReportEllipse"].SetDataSource(item);
            }


        }




        /// <summary>
        /// Se inicializa al inicializar la pagina.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Page_Init(object sender, EventArgs e)
        {
            DataSourceReportesCrystal.CacheDuration = 1000;
            if (!IsPostBack)
            {
                //Primero configuramos la fuente de Datos.
                ConfigurarFuenteDatos();
                //Luego como tal configuramos el reporte en Cristal.
                ConfigureCrystalReports();
            }

        }

        /// <summary>
        /// Configuramos la fuente de datos del reporte.
        /// </summary>
        private void ConfigurarFuenteDatos()
        {
            if (Session["IdGradoSession"] != null && Session["IdAsignaturaSession"] != null)
            {

                IEnumerable o = SqlDataSource1.Select(new DataSourceSelectArguments());
                //DataSourceReportesCrystal.Report = new CrystalDecisions.Web.Report();
                //DataSourceReportesCrystal.Report.FileName = 
                //DataSourceReportesCrystal.ReportDocument = new ReportDocument();
                DataSourceReportesCrystal.ReportDocument.SetDataSource(o);
                

            }

            //GeneradorReportes Generador = new GeneradorReportes();
            //string tipo = string.Empty;
            //List<InfoResultados> dataSource = new List<InfoResultados>();
            //if (Session["DataSetResultados"] != null && Session["TipoConsulta"] != null)
            //{
            //    dataSource = (List<InfoResultados>)Session["DataSetResultados"];
            //    Session["stockValues"] = Generador.GenerarReporte(dataSource, tipo);
            //}

            
        }



        /// <summary>
        /// Llena el dataset de los valores
        /// </summary>
        public void PopulateStockValuesArrayList()
        {
            _vacio = new ArrayList();
            Session["VacioArrayList"] = _vacio;
            if (Session["stockValues"] == null)
            {
                _valoresReporte = new ArrayList();

                Session["stockValues"] = _valoresReporte;


            }
            else
            {
                _valoresReporte = (ArrayList)Session["stockValues"];

            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnUnload(EventArgs e)
        {
            //if (DocumentoReporte.IsLoaded)
            //{
            //    DocumentoReporte.Close();
            //    DocumentoReporte.Dispose();
            //    GC.Collect();
            //}

            base.OnUnload(e);
        }
    }
}